package com.xzgj.fmmall.controller;

import com.github.wxpay.sdk.WXPayUtil;
import com.xzgj.fmmall.service.OrderService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/pay")
@Api(value = "提供支付业务的相关接口",tags = "支付管理")

public class PayController {

    @Resource
    private OrderService orderService;
    /**
     * 支付回调接口：当用户支付成功之后，支付平台会向我们指定当服务器接口发送请求传递订单支付状态数据；
     * 因此创建一个控制器处理这个请求，接受微信支付平台传递过来的数据
     *
     * 微信平台是公网；
     * 我们是在本地当内网，微信平台没法访问---内网穿透
     * ngrok.cc/login
     *
     * 进入到ultrahook官网www.ultrahook.com
     * 注册一个帐号以后网站就会给你一个UltraHook API Key 按照引导，
     * 咱们须要使用到gem install ultrahook 的gem工具
     *
     *  Ngrok实现内网穿透
     * 1。注册账号，申请隧道id
     * 2。ngrok会为我们的隧道生成一个公网可访问的url
     * 3。隧道与本地服务器的映射端口，就是我们支付回调接口所在的服务器端口
     * 4. 开通隧道，获取隧道id
     * 5。下载客户端访问本地域名端口，就等于访问免费的域名
     * @return
     */
    @PostMapping(value = "/callback")
    public String paySuccess(HttpServletRequest request) throws Exception {

        //1。接受微信平台传递的数据，使用request的输入流接收
        ServletInputStream inputStream = request.getInputStream();
        byte[] bs = new byte[1024];
        int length = -1;
        StringBuilder builder = new StringBuilder();
        while ((length = inputStream.read(bs))!=-1){
            builder.append(new String(bs,0,length));
        }

        String str = builder.toString();
        //使用帮助累将xml的字符串转换成map
        Map<String,String> map = WXPayUtil.xmlToMap(str);
        if (map!=null && "success".equalsIgnoreCase(map.get("result_code"))){
            //支付成功
            //2。修改订单状态为"待发货/一支付"
            String orderId = map.get("out_trade_no");
            System.out.println("----orderId:" + orderId);
             int orderStatus = orderService.updateOrderStatus(orderId,"2");
             if (orderStatus > 0){
//3。响应微信支付平台
                 Map<String,String> resp = new HashMap<>();
                 resp.put("return_code","success");
                 resp.put("return_msg","OK");
                 resp.put("appid",map.get("appid"));
                 resp.put("return_code","success");

                 return WXPayUtil.mapToXml(resp);

             }else {
                 return null;
             }

        }else {
            //支付失败
        }
        System.out.println("str:" + str);
        return null;
    }
}
